/* Created on 07/05/2005 */
package br.ufmg.dees.insane.ui.rich.learn.learn_view.model_view.command;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.Border;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

import br.ufmg.dees.insane.ui.rich.learn.learn_view.dialog.MatrixViewTableDialog;

/** Uma classe para a interface grafica dos TPs 10 a 12 
 * resolu��o de sistemas lineares pelos m�todos:
 * Gauss, Gauss Escalonado e por invers�o de A.
 *  
 * @author Camara, Luciana
 * @since 07/05/2005
 * @version 1.0 */
public class ModelPanel extends JPanel implements 
ActionListener, DocumentListener,TableModelListener
{ 
  private static final long serialVersionUID = 1L;

//componente para o titulo do trabalho 
  JLabel titulo;
  
  //componentes dos resultados
  private JTextArea quadroRes;
    
  //parametros das matrizes
  // matriz com os coeficientes do sistema
  private int ordem;
     
  // paineis com matrizes
  private  JPanel painelMA, painelCentral2, painelCentral1, painel1, paineltitulo;
  
  public ModelPanel(){}
  /** Construtor do painel principal do Frame
   * @param w largura da janela escolhida
   * @param h altura da janela escolhida
   * @param opMetodos lista de metodos a ser exibida   */
  public ModelPanel(int w,int h, int o, MatrixViewTableDialog dlgK, String model,MatrixViewTableDialog dlg,String elm){
	  
  	ordem=o;    
//	 Cria painel titulo
	paineltitulo =new JPanel();	
	Border titled = BorderFactory.createEtchedBorder();	
	paineltitulo.setBorder(titled);
	titulo=new JLabel("MODEL");
	titulo.setFont(new Font("SansSerif",Font.BOLD,14));
	paineltitulo.add(titulo);
	
	// cria o painel 
	painel1 = new JPanel();
	Border etched = BorderFactory.createEtchedBorder();
	titled = BorderFactory.createTitledBorder(etched, elm);
	painel1.setBorder(titled);
	GridBagLayout layout = new GridBagLayout();	
	GridBagConstraints configs = new GridBagConstraints();
	painel1.setLayout(layout);	
	configs.fill=GridBagConstraints.NONE;
	configs.anchor=GridBagConstraints.CENTER;
	//configs.weightx=80; configs.weighty=80; // vai esticar na vertical
	JScrollPane spane = new JScrollPane(dlg.getTablePane());
	spane.setPreferredSize(new Dimension(600, 240));
	spane.createHorizontalScrollBar();
 	spane.createVerticalScrollBar();
 	spane.revalidate();
 	spane.repaint();
	//add(painel1,dlg.getTablePane(),configs,0,1,1,1); // ocupa 1 linha da grade
	painel1.add(spane);
	
    //Painel que engloba painel 1 a 3
	painelCentral1 =new JPanel();		
	painelCentral1.setLayout(layout); 
	configs.fill=GridBagConstraints.BOTH;
	configs.weightx=80; configs.weighty=80; // vai esticar na vertical e horizontal
	add(painelCentral1,painel1,configs,0,0,1,4); // ocupa 1 coluna - 4 linhas	
	configs.weightx=80; configs.weighty=80; // vai esticar na horizontal
	
	// Painel para a matriz A
    painelMA=new JPanel();
 	titled = BorderFactory.createTitledBorder(etched, model);
 	painelMA.setBorder(titled);
 	JScrollPane spane1 = new JScrollPane(dlgK.getTablePane());
 	spane1.setPreferredSize(new Dimension(700,320));
 	spane1.createHorizontalScrollBar();
 	spane1.createVerticalScrollBar();
 	spane1.revalidate();
 	spane1.repaint();
 	painelMA.add(spane1);
	
    //Painel que engloba os paines das matrizes
	painelCentral2 =new JPanel();		
	painelCentral2.setLayout(layout);
	configs.fill=GridBagConstraints.BOTH;
	configs.weightx=100; configs.weighty=0; // vai esticar na vertical e horizontal
	configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
	add(painelCentral2,painelMA,configs,0,1,2,5); // ocupa 2 colunas - 5 linhas	
	configs.weightx=100; configs.weighty=100; // vai esticar na vertical e horizontal
	
		
	// adiciona os paineis titulo, central e botoes ao content atual
	setLayout(layout);
	configs.fill=GridBagConstraints.BOTH;
	configs.weightx=100; configs.weighty=0; // nao vai esticar na vertical	
	add(this,paineltitulo,configs,0,0,1,1); // ocupa 1 colunas,1 linha da grade
	configs.weightx=100; configs.weighty=100; // vai esticar na horizontal/vertical
	add(this,painelCentral1,configs,0,1,1,4); // ocupa 1 coluna, 4 linhas da grade
	configs.weightx=100; configs.weighty=100; // nao vai esticar na vertical
	add(this,painelCentral2,configs,0,5,1,5); // ocupa 1 coluna, 4 linhas da grade
	configs.weightx=100; configs.weighty=0; // nao vai esticar na vertical
	
	
  }// fim de menuPanel-construtor
  
  public void setParametro(int p){
  	ordem = p;  	
  }
  
  public int getParametro(){
  	return ordem;  	
  }
   
  /** automatiza o posicionamento no layout GridBagLayout
   * @param j container a adicionar o componente
   * @param c componente a adicionar o elemento
   * @param gbc configuracoes do gridbaglayout
   * @param x coluna da grade
   * @param y linha da grade
   * @param w percentagem de esticamento em x
   * @param h percentagem de esticamento em y*/
  public void add(Container j, Component c, GridBagConstraints gbc, int x,int y, int w, int h){
    gbc.gridx=x;
    gbc.gridy=y;
    gbc.gridwidth=w;
    gbc.gridheight=h;
    j.add(c,gbc);
  }
  
   /** Metodo para tratamento de valores inseridos em JTextField
   * @param e DocumentEvent capturado   */
  public void insertUpdate (DocumentEvent e) {
    try {
      validaDados(); 
    }
    catch (Exception ex){
    quadroRes.setText(ex.getMessage());
    }
  }
  /** Metodo para tratamento de valores removidos em JTextField
   * @param e DocumentEvent capturado   */
  public void removeUpdate (DocumentEvent e) {validaDados(); }
  /** Metodo para tratamento de valores alterados em JTextField
   * @param e DocumentEvent capturado   */
  public void changedUpdate (DocumentEvent e) {validaDados(); }
  
  /** Metodo para validacao e conversao dos campos tipo texto 
   * dos parametros digitados pelo usuario */
  public void validaDados()
  {    
            
    }
   
  	/** executa o m�todo escolhido
	 * @param evt  objeto com o evento escolhido 	 */
	public void actionPerformed(ActionEvent evt) 
	{
	 	
	}// fim de actionPerformed
	
		/** @param n numero de espa�os 
	* @return  uma string com n espacos */
	public String espacos(int n){
	  if (n<2)n=2;
	  String esp="";
	  for (int i=0;i<n;i++) esp+=" ";
	  return esp;
	}

  	/* (non-Javadoc)
  	 * @see javax.swing.event.TableModelListener#tableChanged(javax.swing.event.TableModelEvent)
  	 */
  	public void tableChanged(TableModelEvent e) {
	    //int row = e.getFirstRow();
	    //int column = e.getColumn();
	    //MyTableModel model = (MyTableModel)e.getSource();	    
	   // Object data = model.getValueAt(row, column);
	    
	  }
	
	
/** metodo para reinicializar uma matriz de objects 
 * @param va valor com o qual a matriz sera inicializado
* @return um matriz de ordemxordem reinicializada */
public Object[][] inicializaMatriz(double va){
  Double valor=new Double(va);
  Object[][] mat=new Object[ordem][ordem];
  for (int i=0;i<ordem;i++){
    for (int j=0;j<ordem;j++)mat[i][j]=(Object)valor;
  }
  return mat;  
}

/** metodo para reinicializar um vetor 
 * @param va valor com o qual o vetor sera inicializado
* @return um matriz de 1 coluna reinicializada */
public Object[][] inicializaVetor(double va){
  Double valor=new Double(va);
  Object[][] mat=new Object[ordem][1];
  for (int i=0;i<ordem;i++){
    mat[i][0]=(Object)valor;
  }
  return mat;  
}

/** Metodo para reinicializar o modelo de tabela 
 * @param mat nova matriz de objetos
* @param nc numero de colunas
* @param nl numero de linhas
* @return um novo modelo de tabela */
//public MyTableModel inicializaTabelaModelo(Object[][]mat,int nc,int nl){
  //MyTableModel tabModel=new MyTableModel(mat,nc,nl);
  //return tabModel;
//}

  
}// fim de MenuPanel



